@astablebridge/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+ import type { Preferences } from "../types.js";
2
+ export declare const DEFAULT_PREFERENCES: Preferences;
3
+ export declare function ensureConfigDir(): Promise<void>;
4
+ export declare function getKeyHint(key: string): string;
5
+ export declare function redactSecrets(text: string, key?: string | null): string;
6
+ export declare function getApiKey(): Promise<{
7
+ key: string | null;
8
+ source: "env" | "keychain" | "file" | null;
9
+ }>;
10
+ export declare function setApiKey(apiKey: string, useKeychain?: boolean): Promise<void>;
11
+ export declare function validateKey(apiKey: string): Promise<{
12
+ valid: boolean;
13
+ balance?: number;
14
+ error?: string;
15
+ }>;
16
+ export declare function getBalance(apiKey: string): Promise<number>;
17
+ export declare function getPreferences(): Promise<Preferences | null>;
18
+ export declare function setPreferences(preferences: Partial<Preferences>): Promise<Preferences>;
19
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,mBAAmB,EAAE,WAOjC,CAAC;AAeF,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAMrD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAMvE;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA+B7G;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BjF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/G;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAWlE;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAO5F"}
@@ -0,0 +1,154 @@
1
+ import { mkdir, readFile, writeFile, chmod } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { CONFIG_DIR, CREDENTIALS_FILE, PREFERENCES_FILE, KEYCHAIN_ACCOUNT, KEYCHAIN_SERVICE } from "../types.js";
4
+ export const DEFAULT_PREFERENCES = {
5
+ defaultModel: "core",
6
+ defaultFormat: "webp",
7
+ defaultAspectRatio: "1:1",
8
+ cdnEnabled: false,
9
+ creditBudgetFloor: 0,
10
+ autonomyMode: "plan-then-execute",
11
+ };
12
+ let keytarModule;
13
+ async function getKeytar() {
14
+ if (keytarModule !== undefined)
15
+ return keytarModule;
16
+ try {
17
+ keytarModule = await import("keytar");
18
+ return keytarModule;
19
+ }
20
+ catch {
21
+ keytarModule = null;
22
+ return null;
23
+ }
24
+ }
25
+ export async function ensureConfigDir() {
26
+ if (!existsSync(CONFIG_DIR)) {
27
+ await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
28
+ }
29
+ else {
30
+ await chmod(CONFIG_DIR, 0o700).catch(() => { });
31
+ }
32
+ }
33
+ export function getKeyHint(key) {
34
+ if (key.length <= 8)
35
+ return "sk-***";
36
+ return `${key.slice(0, 3)}...${key.slice(-3)}`;
37
+ }
38
+ export function redactSecrets(text, key) {
39
+ let result = text;
40
+ if (key) {
41
+ result = result.split(key).join(getKeyHint(key));
42
+ }
43
+ return result.replace(/sk-[A-Za-z0-9_-]{8,}/g, (match) => getKeyHint(match));
44
+ }
45
+ export async function getApiKey() {
46
+ const envKey = process.env.STABILITY_API_KEY?.trim();
47
+ if (envKey) {
48
+ return { key: envKey, source: "env" };
49
+ }
50
+ const keytar = await getKeytar();
51
+ if (keytar) {
52
+ try {
53
+ const keychainKey = await keytar.getPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);
54
+ if (keychainKey) {
55
+ return { key: keychainKey, source: "keychain" };
56
+ }
57
+ }
58
+ catch {
59
+ // fall through to file
60
+ }
61
+ }
62
+ if (existsSync(CREDENTIALS_FILE)) {
63
+ try {
64
+ const raw = await readFile(CREDENTIALS_FILE, "utf8");
65
+ const creds = JSON.parse(raw);
66
+ if (creds.apiKey) {
67
+ return { key: creds.apiKey, source: "file" };
68
+ }
69
+ }
70
+ catch {
71
+ return { key: null, source: null };
72
+ }
73
+ }
74
+ return { key: null, source: null };
75
+ }
76
+ export async function setApiKey(apiKey, useKeychain = true) {
77
+ await ensureConfigDir();
78
+ const keytar = await getKeytar();
79
+ if (useKeychain && keytar) {
80
+ try {
81
+ await keytar.setPassword(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, apiKey);
82
+ if (existsSync(CREDENTIALS_FILE)) {
83
+ const creds = {
84
+ apiKey,
85
+ createdAt: new Date().toISOString(),
86
+ };
87
+ await writeFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), "utf8");
88
+ await chmod(CREDENTIALS_FILE, 0o600);
89
+ }
90
+ return;
91
+ }
92
+ catch {
93
+ // fall through to file storage
94
+ }
95
+ }
96
+ const creds = {
97
+ apiKey,
98
+ createdAt: new Date().toISOString(),
99
+ };
100
+ await writeFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), "utf8");
101
+ await chmod(CREDENTIALS_FILE, 0o600);
102
+ }
103
+ export async function validateKey(apiKey) {
104
+ try {
105
+ const response = await fetch("https://api.stability.ai/v1/user/balance", {
106
+ headers: {
107
+ Authorization: `Bearer ${apiKey}`,
108
+ Accept: "application/json",
109
+ },
110
+ });
111
+ if (response.status === 401) {
112
+ return { valid: false, error: "Invalid API key (401 Unauthorized)" };
113
+ }
114
+ if (!response.ok) {
115
+ const text = await response.text();
116
+ return { valid: false, error: `Validation failed (${response.status}): ${redactSecrets(text, apiKey)}` };
117
+ }
118
+ const data = (await response.json());
119
+ return { valid: true, balance: data.credits ?? 0 };
120
+ }
121
+ catch (err) {
122
+ const message = err instanceof Error ? err.message : String(err);
123
+ return { valid: false, error: redactSecrets(message, apiKey) };
124
+ }
125
+ }
126
+ export async function getBalance(apiKey) {
127
+ const result = await validateKey(apiKey);
128
+ if (!result.valid) {
129
+ throw new Error(result.error ?? "Failed to fetch balance");
130
+ }
131
+ return result.balance ?? 0;
132
+ }
133
+ export async function getPreferences() {
134
+ if (!existsSync(PREFERENCES_FILE)) {
135
+ return null;
136
+ }
137
+ try {
138
+ const raw = await readFile(PREFERENCES_FILE, "utf8");
139
+ const parsed = JSON.parse(raw);
140
+ return { ...DEFAULT_PREFERENCES, ...parsed };
141
+ }
142
+ catch {
143
+ return null;
144
+ }
145
+ }
146
+ export async function setPreferences(preferences) {
147
+ await ensureConfigDir();
148
+ const existing = (await getPreferences()) ?? DEFAULT_PREFERENCES;
149
+ const merged = { ...existing, ...preferences };
150
+ await writeFile(PREFERENCES_FILE, JSON.stringify(merged, null, 2) + "\n", "utf8");
151
+ await chmod(PREFERENCES_FILE, 0o600).catch(() => { });
152
+ return merged;
153
+ }
154
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectConfig } from "../types.js";
2
+ export declare function uploadToCdn(buffer: Buffer, filename: string, config: ProjectConfig, contentType: string): Promise<string | undefined>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cdn/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B"}
@@ -0,0 +1,47 @@
1
+ import { put } from "@vercel/blob";
2
+ import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
3
+ export async function uploadToCdn(buffer, filename, config, contentType) {
4
+ const provider = config.cdn?.provider ?? "vercel-blob";
5
+ if (provider === "vercel-blob") {
6
+ return uploadToVercelBlob(buffer, filename, contentType, config.cdn?.prefix);
7
+ }
8
+ if (provider === "s3") {
9
+ return uploadToS3(buffer, filename, contentType, config);
10
+ }
11
+ return undefined;
12
+ }
13
+ async function uploadToVercelBlob(buffer, filename, contentType, prefix) {
14
+ const token = process.env.BLOB_READ_WRITE_TOKEN;
15
+ if (!token) {
16
+ throw new Error("BLOB_READ_WRITE_TOKEN is required for Vercel Blob uploads");
17
+ }
18
+ const pathname = prefix ? `${prefix}/${filename}` : filename;
19
+ const blob = await put(pathname, buffer, {
20
+ access: "public",
21
+ contentType,
22
+ token,
23
+ });
24
+ return blob.url;
25
+ }
26
+ async function uploadToS3(buffer, filename, contentType, config) {
27
+ const bucket = config.cdn?.bucket ?? process.env.AWS_S3_BUCKET;
28
+ const region = config.cdn?.region ?? process.env.AWS_REGION ?? "us-east-1";
29
+ if (!bucket) {
30
+ throw new Error("S3 bucket is required (set cdn.bucket in config or AWS_S3_BUCKET env var)");
31
+ }
32
+ const client = new S3Client({ region });
33
+ const key = config.cdn?.prefix ? `${config.cdn.prefix}/${filename}` : filename;
34
+ await client.send(new PutObjectCommand({
35
+ Bucket: bucket,
36
+ Key: key,
37
+ Body: buffer,
38
+ ContentType: contentType,
39
+ ACL: "public-read",
40
+ }));
41
+ const baseUrl = process.env.AWS_S3_PUBLIC_URL;
42
+ if (baseUrl) {
43
+ return `${baseUrl.replace(/\/$/, "")}/${key}`;
44
+ }
45
+ return `https://${bucket}.s3.${region}.amazonaws.com/${key}`;
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cdn/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,QAAgB,EAChB,MAAqB,EACrB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,aAAa,CAAC;IAEvD,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,QAAgB,EAChB,WAAmB,EACnB,MAAe;IAEf,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE;QACvC,MAAM,EAAE,QAAQ;QAChB,WAAW;QACX,KAAK;KACN,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,QAAgB,EAChB,WAAmB,EACnB,MAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;IAE3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE/E,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,gBAAgB,CAAC;QACnB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,WAAW;QACxB,GAAG,EAAE,aAAa;KACnB,CAAC,CACH,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,WAAW,MAAM,OAAO,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { GenerateOptions } from "../types.js";
2
+ export declare class StabilityApiError extends Error {
3
+ readonly status: number;
4
+ readonly code?: string | undefined;
5
+ constructor(message: string, status: number, code?: string | undefined);
6
+ }
7
+ export interface ImageGenerationResult {
8
+ buffer: Buffer;
9
+ format: string;
10
+ contentType: string;
11
+ }
12
+ export declare function generateCore(apiKey: string, options: GenerateOptions): Promise<ImageGenerationResult>;
13
+ export declare function generateUltra(apiKey: string, options: GenerateOptions): Promise<ImageGenerationResult>;
14
+ export declare function generateImageWithModel(apiKey: string, options: GenerateOptions): Promise<ImageGenerationResult & {
15
+ model: string;
16
+ }>;
17
+ //# sourceMappingURL=stability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stability.d.ts","sourceRoot":"","sources":["../../src/client/stability.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,MAAM;gBAF7B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,YAAA;CAKhC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAqFD,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAE3G;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAE5G;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAOpD"}
@@ -0,0 +1,83 @@
1
+ import { STABILITY_API_BASE } from "../types.js";
2
+ import { redactSecrets } from "../auth/credentials.js";
3
+ export class StabilityApiError extends Error {
4
+ status;
5
+ code;
6
+ constructor(message, status, code) {
7
+ super(message);
8
+ this.status = status;
9
+ this.code = code;
10
+ this.name = "StabilityApiError";
11
+ }
12
+ }
13
+ async function parseImageResponse(response, apiKey, outputFormat) {
14
+ const contentType = response.headers.get("content-type") ?? "";
15
+ if (contentType.startsWith("image/")) {
16
+ const arrayBuffer = await response.arrayBuffer();
17
+ return {
18
+ buffer: Buffer.from(arrayBuffer),
19
+ format: outputFormat,
20
+ contentType,
21
+ };
22
+ }
23
+ const text = await response.text();
24
+ try {
25
+ const json = JSON.parse(text);
26
+ const base64 = json.image ?? json.artifacts?.[0]?.base64;
27
+ if (base64) {
28
+ return {
29
+ buffer: Buffer.from(base64, "base64"),
30
+ format: outputFormat,
31
+ contentType: `image/${outputFormat}`,
32
+ };
33
+ }
34
+ }
35
+ catch {
36
+ // fall through
37
+ }
38
+ throw new StabilityApiError(redactSecrets(`Unexpected response format: ${text.slice(0, 200)}`, apiKey), response.status);
39
+ }
40
+ async function generateImage(apiKey, endpoint, options) {
41
+ const outputFormat = options.outputFormat ?? "webp";
42
+ const aspectRatio = options.aspectRatio ?? "1:1";
43
+ const form = new FormData();
44
+ form.append("prompt", options.prompt);
45
+ form.append("output_format", outputFormat);
46
+ form.append("aspect_ratio", aspectRatio);
47
+ const response = await fetch(`${STABILITY_API_BASE}${endpoint}`, {
48
+ method: "POST",
49
+ headers: {
50
+ Authorization: `Bearer ${apiKey}`,
51
+ Accept: "image/*",
52
+ },
53
+ body: form,
54
+ });
55
+ if (response.status === 401) {
56
+ throw new StabilityApiError("Invalid API key (401 Unauthorized)", 401, "unauthorized");
57
+ }
58
+ if (response.status === 402) {
59
+ throw new StabilityApiError("Insufficient credits (402 Payment Required)", 402, "payment_required");
60
+ }
61
+ if (response.status === 429) {
62
+ throw new StabilityApiError("Rate limited (429). Wait a moment and retry.", 429, "rate_limited");
63
+ }
64
+ if (!response.ok) {
65
+ const text = await response.text();
66
+ throw new StabilityApiError(redactSecrets(`Generation failed (${response.status}): ${text.slice(0, 300)}`, apiKey), response.status);
67
+ }
68
+ return parseImageResponse(response, apiKey, outputFormat);
69
+ }
70
+ export async function generateCore(apiKey, options) {
71
+ return generateImage(apiKey, "/v2beta/stable-image/generate/core", options);
72
+ }
73
+ export async function generateUltra(apiKey, options) {
74
+ return generateImage(apiKey, "/v2beta/stable-image/generate/ultra", options);
75
+ }
76
+ export async function generateImageWithModel(apiKey, options) {
77
+ const model = options.model ?? "core";
78
+ const result = model === "ultra"
79
+ ? await generateUltra(apiKey, options)
80
+ : await generateCore(apiKey, options);
81
+ return { ...result, model };
82
+ }
83
+ //# sourceMappingURL=stability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stability.js","sourceRoot":"","sources":["../../src/client/stability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ProjectConfig } from "../types.js";
2
+ export declare const CONFIG_FILENAME = "stable-bridge.config.json";
3
+ declare const DEFAULT_CONFIG: ProjectConfig;
4
+ export declare function detectAssetsDir(cwd: string): string;
5
+ export declare function loadProjectConfig(cwd: string): Promise<ProjectConfig>;
6
+ export declare function initProject(cwd: string): Promise<{
7
+ configPath: string;
8
+ assetsDir: string;
9
+ created: boolean;
10
+ }>;
11
+ export declare function slugify(text: string): string;
12
+ export declare function buildFilename(prompt: string, format: string, name?: string): string;
13
+ export declare function toPublicPath(assetsDir: string, filename: string): string;
14
+ export declare function getConfigPath(cwd: string): string;
15
+ export { DEFAULT_CONFIG };
16
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,QAAA,MAAM,cAAc,EAAE,aAWrB,CAAC;AAEF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkCnD;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB3E;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC,CAgCD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAInF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASxE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { createHash } from "node:crypto";
5
+ import { getPreferences } from "../auth/credentials.js";
6
+ export const CONFIG_FILENAME = "stable-bridge.config.json";
7
+ const DEFAULT_CONFIG = {
8
+ assetsDir: "public/images/generated",
9
+ cdn: {
10
+ provider: "vercel-blob",
11
+ enabled: false,
12
+ },
13
+ defaultModel: "core",
14
+ defaultFormat: "webp",
15
+ defaultAspectRatio: "1:1",
16
+ creditBudgetFloor: 0,
17
+ autonomyMode: "plan-then-execute",
18
+ };
19
+ export function detectAssetsDir(cwd) {
20
+ const pkgPath = join(cwd, "package.json");
21
+ if (existsSync(pkgPath)) {
22
+ try {
23
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
24
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
25
+ if (deps.next || deps["@next/env"]) {
26
+ return "public/images/generated";
27
+ }
28
+ if (deps.vite || deps["@vitejs/plugin-react"]) {
29
+ return "public/images/generated";
30
+ }
31
+ if (deps["react-scripts"]) {
32
+ return "public/images/generated";
33
+ }
34
+ if (deps.react) {
35
+ return "src/assets/generated";
36
+ }
37
+ }
38
+ catch {
39
+ // fall through
40
+ }
41
+ }
42
+ if (existsSync(join(cwd, "public"))) {
43
+ return "public/images/generated";
44
+ }
45
+ if (existsSync(join(cwd, "src", "assets"))) {
46
+ return "src/assets/generated";
47
+ }
48
+ return "assets/generated";
49
+ }
50
+ export async function loadProjectConfig(cwd) {
51
+ const configPath = join(cwd, CONFIG_FILENAME);
52
+ if (!existsSync(configPath)) {
53
+ return { ...DEFAULT_CONFIG, assetsDir: detectAssetsDir(cwd) };
54
+ }
55
+ const raw = await readFile(configPath, "utf8");
56
+ const parsed = JSON.parse(raw);
57
+ return {
58
+ ...DEFAULT_CONFIG,
59
+ assetsDir: detectAssetsDir(cwd),
60
+ ...parsed,
61
+ cdn: {
62
+ provider: parsed.cdn?.provider ?? DEFAULT_CONFIG.cdn.provider,
63
+ enabled: parsed.cdn?.enabled ?? DEFAULT_CONFIG.cdn.enabled,
64
+ bucket: parsed.cdn?.bucket,
65
+ region: parsed.cdn?.region,
66
+ prefix: parsed.cdn?.prefix,
67
+ },
68
+ };
69
+ }
70
+ export async function initProject(cwd) {
71
+ const configPath = join(cwd, CONFIG_FILENAME);
72
+ const assetsDir = detectAssetsDir(cwd);
73
+ let created = false;
74
+ if (!existsSync(configPath)) {
75
+ const prefs = await getPreferences();
76
+ const config = { ...DEFAULT_CONFIG, assetsDir };
77
+ if (prefs) {
78
+ config.defaultModel = prefs.defaultModel;
79
+ config.defaultFormat = prefs.defaultFormat;
80
+ config.defaultAspectRatio = prefs.defaultAspectRatio;
81
+ config.creditBudgetFloor = prefs.creditBudgetFloor;
82
+ config.autonomyMode = prefs.autonomyMode;
83
+ config.cdn = {
84
+ provider: config.cdn?.provider ?? "vercel-blob",
85
+ enabled: prefs.cdnEnabled,
86
+ bucket: config.cdn?.bucket,
87
+ region: config.cdn?.region,
88
+ prefix: config.cdn?.prefix,
89
+ };
90
+ }
91
+ await writeFile(configPath, JSON.stringify(config, null, 2) + "\n", "utf8");
92
+ created = true;
93
+ }
94
+ const fullAssetsPath = join(cwd, assetsDir);
95
+ if (!existsSync(fullAssetsPath)) {
96
+ await mkdir(fullAssetsPath, { recursive: true });
97
+ }
98
+ return { configPath, assetsDir, created };
99
+ }
100
+ export function slugify(text) {
101
+ return text
102
+ .toLowerCase()
103
+ .replace(/[^a-z0-9]+/g, "-")
104
+ .replace(/^-+|-+$/g, "")
105
+ .slice(0, 40) || "image";
106
+ }
107
+ export function buildFilename(prompt, format, name) {
108
+ const hash = createHash("sha256").update(prompt + Date.now()).digest("hex").slice(0, 4);
109
+ const base = name ? slugify(name) : slugify(prompt);
110
+ return `${base}-${hash}.${format}`;
111
+ }
112
+ export function toPublicPath(assetsDir, filename) {
113
+ const normalized = assetsDir.replace(/\\/g, "/");
114
+ if (normalized.startsWith("public/")) {
115
+ return "/" + normalized.slice("public/".length) + "/" + filename;
116
+ }
117
+ if (normalized.startsWith("src/assets/")) {
118
+ return "/" + normalized.slice("src/".length) + "/" + filename;
119
+ }
120
+ return "/" + normalized + "/" + filename;
121
+ }
122
+ export function getConfigPath(cwd) {
123
+ return join(cwd, CONFIG_FILENAME);
124
+ }
125
+ export { DEFAULT_CONFIG };
126
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/config/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir } from "./auth/credentials.js";
2
+ import { generateCore, generateUltra, generateImageWithModel, StabilityApiError } from "./client/stability.js";
3
+ import { loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG } from "./config/project.js";
4
+ import { placeInProject, BudgetExceededError, ESTIMATED_COST } from "./placement/assets.js";
5
+ import { uploadToCdn } from "./cdn/index.js";
6
+ import { insertImage, buildSnippet, detectFramework, applySnippet } from "./insert/index.js";
7
+ import { startOnboardServer } from "./onboard/server.js";
8
+ import type { Credentials, Preferences, AutonomyMode, ProjectConfig, GenerateOptions, GenerateResult, InsertOptions, InsertResult, StatusResult, InitResult } from "./types.js";
9
+ export { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir, generateCore, generateUltra, generateImageWithModel, StabilityApiError, loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG, placeInProject, BudgetExceededError, ESTIMATED_COST, uploadToCdn, insertImage, buildSnippet, detectFramework, applySnippet, startOnboardServer, };
10
+ export type { Credentials, Preferences, AutonomyMode, ProjectConfig, GenerateOptions, GenerateResult, InsertOptions, InsertResult, StatusResult, InitResult, };
11
+ export declare function getStatus(): Promise<StatusResult>;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,CAAC;AAEF,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,CAAC;AAEF,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAmCvD"}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ import { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir, } from "./auth/credentials.js";
2
+ import { generateCore, generateUltra, generateImageWithModel, StabilityApiError } from "./client/stability.js";
3
+ import { loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG, } from "./config/project.js";
4
+ import { placeInProject, BudgetExceededError, ESTIMATED_COST } from "./placement/assets.js";
5
+ import { uploadToCdn } from "./cdn/index.js";
6
+ import { insertImage, buildSnippet, detectFramework, applySnippet } from "./insert/index.js";
7
+ import { startOnboardServer } from "./onboard/server.js";
8
+ export { getApiKey, getKeyHint, setApiKey, validateKey, getBalance, getPreferences, setPreferences, DEFAULT_PREFERENCES, redactSecrets, ensureConfigDir, generateCore, generateUltra, generateImageWithModel, StabilityApiError, loadProjectConfig, initProject, detectAssetsDir, buildFilename, toPublicPath, slugify, CONFIG_FILENAME, DEFAULT_CONFIG, placeInProject, BudgetExceededError, ESTIMATED_COST, uploadToCdn, insertImage, buildSnippet, detectFramework, applySnippet, startOnboardServer, };
9
+ export async function getStatus() {
10
+ const { key, source } = await getApiKey();
11
+ const prefs = (await getPreferences()) ?? DEFAULT_PREFERENCES;
12
+ const prefsResult = {
13
+ autonomyMode: prefs.autonomyMode,
14
+ creditBudgetFloor: prefs.creditBudgetFloor,
15
+ defaultModel: prefs.defaultModel,
16
+ defaultFormat: prefs.defaultFormat,
17
+ defaultAspectRatio: prefs.defaultAspectRatio,
18
+ cdnEnabled: prefs.cdnEnabled,
19
+ };
20
+ if (!key) {
21
+ return { configured: false, ...prefsResult };
22
+ }
23
+ try {
24
+ const balance = await getBalance(key);
25
+ return {
26
+ configured: true,
27
+ keyHint: getKeyHint(key),
28
+ balance,
29
+ source: source ?? undefined,
30
+ ...prefsResult,
31
+ };
32
+ }
33
+ catch (err) {
34
+ const message = err instanceof Error ? err.message : String(err);
35
+ return {
36
+ configured: true,
37
+ keyHint: getKeyHint(key),
38
+ source: source ?? undefined,
39
+ error: redactSecrets(message, key),
40
+ ...prefsResult,
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAczD,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,YAAY,EACZ,OAAO,EACP,eAAe,EACf,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,CAAC;AAeF,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC,IAAI,mBAAmB,CAAC;IAC9D,MAAM,WAAW,GAAG;QAClB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IAEF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;YACxB,OAAO;YACP,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,GAAG,WAAW;SACf,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC;YACxB,MAAM,EAAE,MAAM,IAAI,SAAS;YAC3B,KAAK,EAAE,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC;YAClC,GAAG,WAAW;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { InsertOptions, InsertResult } from "../types.js";
2
+ export type Framework = "nextjs" | "react" | "html" | "markdown" | "css";
3
+ export declare function detectFramework(filePath: string): Framework;
4
+ export declare function buildSnippet(framework: Framework, imagePath: string, alt?: string): string;
5
+ export declare function applySnippet(filePath: string, snippet: string, options: {
6
+ placeholder?: string;
7
+ framework: Framework;
8
+ }): Promise<boolean>;
9
+ export declare function insertImage(cwd: string, apiKey: string, options: InsertOptions): Promise<InsertResult>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/insert/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkB,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;AAEzE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAgB3D;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,GAAG,SAAoB,GACtB,MAAM,CAcR;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,GACtD,OAAO,CAAC,OAAO,CAAC,CAkClB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}